/*
  切割绳子
  题目描述
    有 n 条绳子，每条绳子的长度已知且均为正整数。
    绳子可以以任意正整数长度切割，但不可以连接。
    现在要从这些绳子中切割出 m 条长度相同的绳段，求绳段的最大长度是多少。
  输入格式
    第一行是一个不超过 100 的正整数 n。
    第二行是 n 个不超过 10^6 的正整数，表示每条绳子的长度。
    第三行是一个不超过 10^8 的正整数 m。
  输出格式
    绳段的最大长度，若无法切割，输出 “Failed”。
  输入数据 1
    3
    5 10 8
    2
  输出数据 1
    8
*/

#include <bits/stdc++.h>

using namespace std;

/*
  思路:
    通常采用二分答案算法的话, 需要首先明确 2 个核心问题:
      1) 答案的取值范围(区间)，即确定区间的最大值和最小值
      2) 判断某个答案是否满足题意(条件)的判定方法
    解答本题时，先明确出这 2 个问题:
      1）答案的取值范围(区间)
          区间的最小值为 1;
          区间的最大值为最开始 n 条绳子中的最大长度
      2) 判断某个答案是否满足题意的判定方法:
          首先计算出：以该答案(长度)进行切割，最多可以切出的该长度的绳段数；
          如果得到的绳段数大于等于 m，则该答案满足题目要求；
          否则，则该答案不满题目要求!
*/

int n, m;
int a[105] = {};  // a[i] 表示第 i 条绳子的长度 (其中 i > 0)
int s = 1, e = 1; // s(start) 表示二分答案算法实现中进行二分查找时的开始边界(左边界)
                  // e(end)   表示二分答案算法实现中进行二分查找时的结束边界(右边界)
int ans = 0;      // 表示绳段的最大长度

// 该函数用来判断输入 x(表示答案，即绳段的长度) 是否满足条件(题目要求)
bool check(int x) {
    long long sum = 0; // 可以切出的长度为 x 的绳段数量

    // 如果可以切割出 m 根长度为 x 的绳段(sum >= m)，则返回 true
    // 否则返回 false
    for (int i = 1; i <= n; i++) {
        sum += a[i] / x;
    }

    return sum >= m;
}

int main() {

    cin >> n; // 从命令行输入共有 n，表示最开始时有 n 条绳子
    for (int i = 1; i <= n; i++) {
        cin >> a[i];    // 从命令行输入最开始时每条绳子的长度
        if (e < a[i]) { // 二分查找时结束边界(右边界)，即绳段的取值范围(区间)的最大值为 n 条绳子中的最长的那条绳子的长度
            e = a[i];
        }
    }

    cin >> m;
    /*
      用二分查找法，在答案的区间范围内，查找满足题目要求的最大值
    */
    while (s <= e) {
        int mid = (s + e) / 2;
        if (check(mid)) {
            ans = mid;
            s = mid + 1;  // 由于需要答案尽可能地大，所以我们进一步从 mid 的右半区间进行查找
        } else {
            e = mid - 1;  // mid 不满足题目要求，从 mid 的左半区间进行查找
        }
    }
    if (ans == 0) { // 若无法给出满足题目要求的切割方案(ans 的初始值为0，为 0 表示无法切割)，输出 “Failed”
        cout << "Failed";
    } else {  // 找到满足题目要求的最大值
        cout << ans;
    }

    return 0;
}